package com.school.sports.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.school.sports.entity.Message;

import java.util.List;
import java.util.Map;

/**
 * 消息表服务接口
 * 提供消息数据的业务逻辑操作，包括系统消息管理、消息推送、消息中心等功能
 */
public interface MessageService extends IService<Message> {

    /**
     * 分页查询消息列表
     * @param currentPage 当前页码
     * @param pageSize 每页显示数量
     * @param message 查询条件对象
     * @return 包含消息数据的分页对象
     */
    IPage<Message> getPage(int currentPage, int pageSize, Message message);

    /**
     * 按条件查询消息列表
     * @param message 查询条件对象
     * @return 满足条件的消息列表
     */
    List<Message> listByCondition(Message message);

    /**
     * 更新消息阅读状态
     * @param id 消息ID
     * @param isRead 阅读状态（0-未读，1-已读）
     * @return 是否更新成功
     */
    boolean updateReadStatus(Long id, Integer isRead);

    /**
     * 批量更新用户的消息为已读状态
     * @param userId 用户ID
     * @return 影响的行数
     */
    int updateBatchReadStatus(Long userId);

    /**
     * 获取用户未读消息数量
     * @param userId 用户ID
     * @return 未读消息数量
     */
    int getUnreadCount(Long userId);

    // ==================== 系统消息管理 ====================

    /**
     * 发送系统消息
     * @param title 消息标题
     * @param content 消息内容
     * @param userId 接收者用户ID
     * @return 消息对象
     */
    Message sendSystemMessage(String title, String content, Long userId);

    /**
     * 根据角色发送消息
     * @param title 消息标题
     * @param content 消息内容
     * @param messageType 消息类型
     * @param roles 角色数组
     * @return 发送结果
     */
    boolean sendMessageToRoles(String title, String content, String messageType, String[] roles);

    /**
     * 批量发送系统消息
     * @param title 消息标题
     * @param content 消息内容
     * @param userIds 接收者用户ID列表
     * @return 发送的消息数量
     */
    int batchSendSystemMessage(String title, String content, List<Long> userIds);

    /**
     * 发送系统通知
     * @param message 消息对象
     * @return 是否发送成功
     */
    boolean sendSystemNotification(Message message);

    /**
     * 广播系统消息给所有用户
     * @param title 消息标题
     * @param content 消息内容
     * @return 发送结果
     */
    boolean broadcastSystemMessage(String title, String content);

    // ==================== 消息推送功能 ====================

    /**
     * 推送消息到用户
     * @param message 消息对象
     * @return 推送结果
     */
    boolean pushNotification(Message message);

    /**
     * 推送消息到指定用户
     * @param title 消息标题
     * @param content 消息内容
     * @param userId 用户ID
     * @return 推送结果
     */
    boolean pushNotificationToUser(String title, String content, Long userId);

    /**
     * 批量推送消息
     * @param message 消息对象
     * @param userIds 用户ID列表
     * @return 推送结果
     */
    boolean batchPushNotification(Message message, List<Long> userIds);

    /**
     * 推送审核结果消息
     * @param title 消息标题
     * @param content 消息内容
     * @param userId 用户ID
     * @param extraData 扩展数据
     * @return 推送结果
     */
    boolean pushAuditResult(String title, String content, Long userId, String extraData);

    /**
     * 推送赛程变更消息
     * @param title 消息标题
     * @param content 消息内容
     * @param userIds 用户ID列表
     * @param linkUrl 相关链接
     * @return 推送结果
     */
    boolean pushScheduleChange(String title, String content, List<Long> userIds, String linkUrl);

    /**
     * 推送获奖通知
     * @param title 消息标题
     * @param content 消息内容
     * @param userId 用户ID
     * @param extraData 扩展数据
     * @return 推送结果
     */
    boolean pushAwardNotification(String title, String content, Long userId, String extraData);

    /**
     * 推送紧急通知
     * @param title 消息标题
     * @param content 消息内容
     * @param userIds 用户ID列表
     * @return 推送结果
     */
    boolean pushUrgentNotification(String title, String content, List<Long> userIds);

    // ==================== 消息中心管理 ====================

    /**
     * 获取用户消息列表
     * @param userId 用户ID
     * @param messageType 消息类型
     * @param isRead 是否已读
     * @param limit 限制数量
     * @return 消息列表
     */
    List<Message> getUserMessages(Long userId, String messageType, Integer isRead, Integer limit);

    /**
     * 获取用户未读消息列表
     * @param userId 用户ID
     * @return 未读消息列表
     */
    List<Message> getUnreadMessages(Long userId);

    /**
     * 获取用户已读消息列表
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 已读消息列表
     */
    List<Message> getReadMessages(Long userId, Integer limit);

    /**
     * 按消息类型获取用户消息
     * @param userId 用户ID
     * @param messageType 消息类型
     * @return 消息列表
     */
    List<Message> getMessagesByType(Long userId, String messageType);

    /**
     * 获取系统通知列表
     * @param userId 用户ID
     * @return 系统通知列表
     */
    List<Message> getSystemNotifications(Long userId);

    /**
     * 获取紧急消息列表
     * @param userId 用户ID
     * @return 紧急消息列表
     */
    List<Message> getUrgentMessages(Long userId);

    /**
     * 获取最新消息
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 最新消息列表
     */
    List<Message> getLatestMessages(Long userId, Integer limit);

    /**
     * 获取消息详情
     * @param messageId 消息ID
     * @param userId 用户ID
     * @return 消息详情
     */
    Message getMessageDetail(Long messageId, Long userId);

    /**
     * 标记消息为已读
     * @param messageId 消息ID
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean markAsRead(Long messageId, Long userId);

    /**
     * 删除用户消息
     * @param messageId 消息ID
     * @param userId 用户ID
     * @return 是否删除成功
     */
    boolean deleteUserMessage(Long messageId, Long userId);

    /**
     * 清空用户消息
     * @param userId 用户ID
     * @return 是否清空成功
     */
    boolean clearUserMessages(Long userId);

    // ==================== 消息统计功能 ====================

    /**
     * 获取用户消息统计
     * @param userId 用户ID
     * @return 消息统计信息
     */
    Map<String, Object> getMessageStatistics(Long userId);

    /**
     * 获取各类型消息数量统计
     * @param userId 用户ID
     * @return 消息类型统计
     */
    Map<String, Integer> getMessageTypeStatistics(Long userId);

    /**
     * 获取系统消息统计
     * @return 系统消息统计
     */
    Map<String, Object> getSystemMessageStatistics();

    /**
     * 获取每日消息统计
     * @param days 统计天数
     * @return 每日消息统计
     */
    List<Map<String, Object>> getDailyMessageStatistics(Integer days);

    /**
     * 获取用户消息阅读率
     * @param userId 用户ID
     * @return 阅读率统计
     */
    double getMessageReadRate(Long userId);

    /**
     * 获取系统消息阅读率
     * @return 系统消息阅读率
     */
    double getSystemMessageReadRate();

    // ==================== 消息模板管理 ====================

    /**
     * 创建消息模板
     * @param templateName 模板名称
     * @param templateContent 模板内容
     * @param messageType 消息类型
     * @return 是否创建成功
     */
    boolean createMessageTemplate(String templateName, String templateContent, String messageType);

    /**
     * 使用模板发送消息
     * @param templateName 模板名称
     * @param params 参数
     * @param userId 用户ID
     * @return 消息对象
     */
    Message sendMessageWithTemplate(String templateName, Map<String, String> params, Long userId);

    /**
     * 批量使用模板发送消息
     * @param templateName 模板名称
     * @param params 参数
     * @param userIds 用户ID列表
     * @return 发送的消息数量
     */
    int batchSendMessageWithTemplate(String templateName, Map<String, String> params, List<Long> userIds);

    /**
     * 获取消息模板列表
     * @param messageType 消息类型
     * @return 模板列表
     */
    List<Map<String, Object>> getMessageTemplates(String messageType);

    /**
     * 更新消息模板
     * @param templateName 模板名称
     * @param templateContent 模板内容
     * @return 是否更新成功
     */
    boolean updateMessageTemplate(String templateName, String templateContent);

    /**
     * 删除消息模板
     * @param templateName 模板名称
     * @return 是否删除成功
     */
    boolean deleteMessageTemplate(String templateName);

    // ==================== 批量消息处理 ====================

    /**
     * 批量标记消息为已读
     * @param messageIds 消息ID列表
     * @param userId 用户ID
     * @return 处理结果
     */
    int batchMarkAsRead(List<Long> messageIds, Long userId);

    /**
     * 批量删除消息
     * @param messageIds 消息ID列表
     * @param userId 用户ID
     * @return 删除结果
     */
    int batchDeleteMessages(List<Long> messageIds, Long userId);

    /**
     * 批量发送自定义消息
     * @param messages 消息列表
     * @return 发送结果
     */
    int batchSendMessages(List<Message> messages);

    /**
     * 批量标记所有消息为已读
     * @param userId 用户ID
     * @return 处理结果
     */
    boolean markAllAsRead(Long userId);

    /**
     * 批量清空指定类型的消息
     * @param userId 用户ID
     * @param messageType 消息类型
     * @return 清空结果
     */
    boolean clearMessagesByType(Long userId, String messageType);

    // ==================== 消息撤回功能 ====================

    /**
     * 撤回消息
     * @param messageId 消息ID
     * @param senderId 发送者ID
     * @return 是否撤回成功
     */
    boolean recallMessage(Long messageId, Long senderId);

    /**
     * 检查消息是否可撤回
     * @param messageId 消息ID
     * @param senderId 发送者ID
     * @return 是否可撤回
     */
    boolean canRecallMessage(Long messageId, Long senderId);

    /**
     * 批量撤回消息
     * @param messageIds 消息ID列表
     * @param senderId 发送者ID
     * @return 撤回结果
     */
    int batchRecallMessages(List<Long> messageIds, Long senderId);

    /**
     * 获取已撤回消息列表
     * @param userId 用户ID
     * @return 已撤回消息列表
     */
    List<Message> getRecalledMessages(Long userId);

    // ==================== 其他功能 ====================

    /**
     * 设置消息优先级
     * @param messageId 消息ID
     * @param priority 优先级
     * @return 是否设置成功
     */
    boolean setMessagePriority(Long messageId, Integer priority);

    /**
     * 获取高优先级消息
     * @param userId 用户ID
     * @return 高优先级消息列表
     */
    List<Message> getHighPriorityMessages(Long userId);

    /**
     * 设置消息过期时间
     * @param messageId 消息ID
     * @param expireTime 过期时间
     * @return 是否设置成功
     */
    boolean setMessageExpireTime(Long messageId, String expireTime);

    /**
     * 清理过期消息
     * @param days 过期天数
     * @return 清理结果
     */
    int cleanExpiredMessages(Integer days);

    /**
     * 设置消息链接
     * @param messageId 消息ID
     * @param linkUrl 链接URL
     * @return 是否设置成功
     */
    boolean setMessageLink(Long messageId, String linkUrl);

    /**
     * 设置消息扩展数据
     * @param messageId 消息ID
     * @param extraData 扩展数据
     * @return 是否设置成功
     */
    boolean setMessageExtraData(Long messageId, String extraData);

    /**
     * 获取消息关键词
     * @param messageId 消息ID
     * @return 关键词列表
     */
    List<String> getMessageKeywords(Long messageId);

    /**
     * 搜索消息
     * @param userId 用户ID
     * @param keyword 关键词
     * @param messageType 消息类型
     * @return 搜索结果
     */
    List<Message> searchMessages(Long userId, String keyword, String messageType);

    /**
     * 标记消息为已读
     * @param messageId 消息ID
     * @param userId 用户ID
     */
    void markMessageAsRead(Long messageId, Long userId);

    /**
     * 获取用户未读消息数量
     * @param userId 用户ID
     * @return 未读消息数量（int类型）
     */
    int getUnreadMessageCount(Long userId);
}
